From: iap10@labyrinth.cl.cam.ac.uk Date: Sat, 25 Sep 2004 12:35:46 +0000 (+0000) Subject: bitkeeper revision 1.1159.93.1 (41556622dHm-ebfFQ37g3zM37ASpCw) X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~17400^2~568^2 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22?a=commitdiff_plain;h=57e7adc5ca8747db9a53ec63f8b10e9dd5da627a;p=xen.git bitkeeper revision 1.1159.93.1 (41556622dHm-ebfFQ37g3zM37ASpCw) extra debug --- diff --git a/xen/arch/x86/memory.c b/xen/arch/x86/memory.c index 0c3fcc5966..baf8a040ff 100644 --- a/xen/arch/x86/memory.c +++ b/xen/arch/x86/memory.c @@ -1864,7 +1864,7 @@ void ptwr_status(void) void audit_domain( struct domain *d) { - int ttot=0, ctot=0; + int ttot=0, ctot=0, io_mappings=0, lowmem_mappings=0; void adjust ( struct pfn_info *page, int dir, int adjtype ) { int count = page->count_info & PGC_count_mask; @@ -2059,7 +2059,7 @@ void audit_domain( struct domain *d) if ( l1page->u.inuse.domain != d ) { - printk("Skip page belowing to other dom %p\n", + printk("L2: Skip bizare page belowing to other dom %p\n", l1page->u.inuse.domain); continue; } @@ -2128,6 +2128,18 @@ void audit_domain( struct domain *d) unsigned long l1pfn = pt[i]>>PAGE_SHIFT; struct pfn_info *l1page = &frame_table[l1pfn]; + if ( l1pfn < 0x100 ) + { + lowmem_mappings++; + continue; + } + + if ( l1pfn > max_page ) + { + io_mappings++; + continue; + } + if ( pt[i] & _PAGE_RW ) { @@ -2144,8 +2156,13 @@ void audit_domain( struct domain *d) if ( l1page->u.inuse.domain != d ) { - printk("Skip page belowing to other dom %p\n", - l1page->u.inuse.domain); + printk("Audit %d: [%lx,%x] Skip foreign page dom=%lx pfn=%lx c=%08x t=%08x m2p=%lx\n", + d->domain, pfn, i, + (unsigned long)l1page->u.inuse.domain, + l1pfn, + l1page->count_info, + l1page->u.inuse.type_info, + machine_to_phys_mapping[l1pfn]); continue; } @@ -2156,13 +2173,15 @@ void audit_domain( struct domain *d) unmap_domain_mem(pt); break; - } - - + } list_ent = frame_table[pfn].list.next; } + if ( io_mappings>0 || lowmem_mappings>0 ) + printk("Audit %d: Found %d lowmem mappings and %d io mappings\n", + d->domain, lowmem_mappings, io_mappings); + /* phase 2 */ ctot = ttot = 0; @@ -2252,8 +2271,11 @@ void audit_domain( struct domain *d) unsigned long l1pfn = pt[i]>>PAGE_SHIFT; struct pfn_info *l1page = &frame_table[l1pfn]; - if ( l1page->u.inuse.domain == d) - adjust( l1page, 1, 0 ); + if ( l1page->u.inuse.domain != d) continue; + if ( l1pfn < 0x100 ) continue; + if ( l1pfn > max_page ) continue; + + adjust( l1page, 1, 0 ); #endif } } @@ -2286,8 +2308,7 @@ void audit_domains(void) for_each_domain ( d ) { - if ( d->domain > 0 ) - audit_domain(d); + audit_domain(d); } } diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index 486fd94441..ed2d4dc3be 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -385,9 +385,12 @@ static int shadow_mode_table_op(struct domain *d, 0, bytes); } +#if 0 /* This optimisation is dangerous for some uses of this function. + disable for the moment */ /* Might as well stop the domain as an optimization. */ if ( zero ) domain_pause_by_systemcontroller(d); +#endif break; } @@ -487,8 +490,21 @@ int shadow_mode_control(struct domain *d, dom0_shadow_control_t *sc) static inline struct pfn_info *alloc_shadow_page(struct mm_struct *m) { + struct pfn_info *page; m->shadow_page_count++; - return alloc_domheap_page(NULL); + page = alloc_domheap_page(NULL); + + if( unlikely(page == NULL) ) + { + printk("Couldn't alloc shadow page! count=%d\n", + m->shadow_page_count); + SH_VLOG("Shadow tables l1=%d l2=%d", + perfc_value(shadow_l1_pages), + perfc_value(shadow_l2_pages)); + BUG(); // FIXME: try a shadow flush to free up some memory + } + + return page; } void unshadow_table( unsigned long gpfn, unsigned int type ) diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h index 60b2ef3ba9..5914d62b4c 100644 --- a/xen/include/asm-x86/shadow.h +++ b/xen/include/asm-x86/shadow.h @@ -118,17 +118,20 @@ static inline int __mark_dirty( struct mm_struct *m, unsigned int mfn ) } else { - SH_LOG("mark_dirty OOR! mfn=%x pfn=%x max=%x (mm %p)", - mfn, pfn, m->shadow_dirty_bitmap_size, m ); - SH_LOG("dom=%p caf=%08x taf=%08x\n", - frame_table[mfn].u.inuse.domain, - frame_table[mfn].count_info, - frame_table[mfn].u.inuse.type_info ); + if ( mfn < max_page ) { - extern void show_trace(unsigned long *esp); - unsigned long *esp; - __asm__ __volatile__ ("movl %%esp,%0" : "=r" (esp) : ); - show_trace(esp); + SH_LOG("mark_dirty OOR! mfn=%x pfn=%x max=%x (mm %p)", + mfn, pfn, m->shadow_dirty_bitmap_size, m ); + SH_LOG("dom=%p caf=%08x taf=%08x\n", + frame_table[mfn].u.inuse.domain, + frame_table[mfn].count_info, + frame_table[mfn].u.inuse.type_info ); + { + extern void show_trace(unsigned long *esp); + unsigned long *esp; + __asm__ __volatile__ ("movl %%esp,%0" : "=r" (esp) : ); + show_trace(esp); + } } }